package cn.tedu.oop2;
/*本类用作抽象类中的成员测试:定义宽泛*/
public class AbstractDemo3 {
    public static void main(String[] args) {
        Fruit fruit = new Banana();
        fruit.eat();
        fruit.fly();
        fruit.eat2();
//        fruit.usage();
        System.out.println(fruit.NAME); //多态对象,优先调用父类属性方法,除了sout打印方法调用子类的重写的ToString(标记或没标记@Override都可以)方法
    }

}
//1.创建抽象父类
abstract class Fruit{
    /*1.抽象类中可以定义成员变量吗?--可以!*/
    int sum /*= 100*/;
    /*2.抽象类中可以定义成员常量吗?--可以!*/
    final String NAME = "小绿人";
    final static String NAME1 = "小绿人";
    /*3.抽象类中可以定义普通方法吗?*/
    public void eat(){
        System.out.println("吃啥都行!");
    }

    public void eat2(){
        System.out.println("吃啥都行!");
    }

    /*4.抽象类中可以定义抽象方法吗?--可以!*/
    public /*static*/ /*private*/ /*final*/ abstract void fly();
    /*5.抽象类中可以全是普通方法吗?--可以!*/
    /*如果一个类中都是普通方法,那它为什么还要被修饰成抽象类呢?
     * 因为:抽象类不可以被实例化,所以如果不想让外界创建本类的对象
     * 就可以把普通类声明成抽象类*/
    /*6.抽象类中可以全是抽象方法吗?--可以!*/
}
//2.创建子类
//abstract class Banana extends Fruit{ //a父类
class Banana extends Fruit{
    final String NAME = "小黄人";
    //@Override
    public void fly() {
        System.out.println("实现了Fruit抽象类的抽象方法");
    }

    public void usage(){
        System.out.println("Superman Banana~");
    }
    @Override // 1)实现效果方面,重写的标记可用可不用,2)但有个注解,方便程序员查看
    public void eat(){
        System.out.println("eat banana~");
    }

}